perm filename SCANER.SAI[SYS,HE]6 blob sn#021176 filedate 1973-01-24 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00010 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00003 00002	ENTRY XTENT
 00007 00003	⊃	CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT
 00010 00004	⊃	DEBUGGING ROUTINES
 00012 00005	⊃	INITIALIZES SENSITIVITY CONTROL
 00015 00006	⊃	SET CLIP LEVELS TO JUST INCLUDE THE RANGE
 00017 00007	⊃	GENERAL ACCOMODATION ROUTINE
 00021 00008	⊃	ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS
 00023 00009	⊃  VERIFIES  THAT  DETECTED  DISCONTINUITY  BELONGS TO AN OBJECT EDGE OF
 00027 00010	⊃ 	TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
 00029 ENDMK
⊗;
ENTRY XTENT;
BEGIN "SCNER"
REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE 500 STRING_SPACE;

EXTERNAL INTEGER PROCEDURE GETPNT(INTEGER X,Y);
EXTERNAL PROCEDURE INTPNT;
EXTERNAL PROCEDURE TVIN;
EXTERNAL INTEGER PROCEDURE GENTER(INTEGER X,Y; REFERENCE BOOLEAN O;
	REFERENCE INTEGER D);
EXTERNAL INTEGER PROCEDURE DDACO(INTEGER DAC);
EXTERNAL INTEGER PROCEDURE YOPER(INTEGER X,Y; REFERENCE INTEGER ANG;
	INTEGER CW; BOOLEAN TRAC,FLAG);

DEFINE CRLF="'15&'12",⊃="COMMENT", TVRESET="STVFL←0", SAFEX="SAFE",
	TVX(X)="(X)*3.0-512.0", TVY(Y)="512.0-(Y)*3.0";
EXTERNAL BOOLEAN ACCOMINIT;	⊃	 RESETS STATISTICS FOR NEW SCENE;
EXTERNAL INTEGER BCLIP, TCLIP, FLINE, LLINE, RSIDE, LSIDE, IND, TMAX, BMAX,
	LSMAX, RSMAX, STVFL, IWID, TVCAM, GTHRES, JOBNUM, CLDIFF, NODAC;
EXTERNAL REAL OD, OB;
INTEGER INT,INT2,KKP,FRAMEX,CLIPDIF,I1, I2, CW, TRAC, X2, Y2, DIR;
INTERNAL BOOLEAN SCAN_ACC, SCAN_DIR;
BOOLEAN ADEB, DISSHW;
SAFEX INTEGER ARRAY DISPL[1:100];
SAFEX BOOLEAN ARRAY TDAC[0:63];
PRELOAD_WITH 0, [3] 1, 0, [3] -1;
SAFEX INTEGER ARRAY SDIRX[0:7];
PRELOAD_WITH 1, 1, 0, [3] -1, 0, 1;
SAFEX INTEGER ARRAY SDIRY[0:7];

SIMPLE PROCEDURE OUTCLIP(STRING LAB);
	IF TYP_EDGE THEN
		OUTSTR(LAB&" TCLIP="&CVS(TCLIP)&"  BCLIP="&CVS(BCLIP)&CRLF);

⊃	CHECK CLIP LEVEL AND ADJUST IF CHANGED;
	
SIMPLE INTERNAL PROCEDURE REINIT;
	IF ABS(TCLIP-BCLIP)<CLIPDIF THEN
		BEGIN
		TCLIP←(7-CLIPDIF) DIV 2;
		BCLIP←TCLIP+CLIPDIF;
		TVRESET;
		OUTCLIP("REINIT");
		END;
⊃	CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT;

SIMPLE INTERNAL PROCEDURE CLIPCHG(INTEGER DIF);
	BEGIN
	IF DIF<0 THEN DIF←0;
	IF DIF>7 THEN DIF←7;
	CLIPDIF ← DIF;
	REINIT;
	END;

SIMPLE INTEGER PROCEDURE DACO(INTEGER D);
	IF 0<D≤62 THEN
		BEGIN INTEGER I;
		I ← DDACO(D);
		TDAC[D] ← FALSE;
		TVRESET;
		IF TYP_EDGE THEN
			OUTSTR("DAC SET AT "&CVS(D)&"   AD="&CVS(I)&CRLF);
		RETURN(I);
		END;


⊃		VARIABLES USED FOR SENSITIVITY CONTROL

AUTO_ACC	SETTING OF DAC AT AUTOTARGET LIMIT
AUTOCAL_ACC	TABLE_ACC INITIALIZED
DAC_ACC		CURRENT DAC SETTING
SENSCAL_ACC	SENSITIVITY HAS BEEN CALIBRATED
SENSIGN_ACC	LAST CHANGE   1 UP, -1 DOWN [NOT USED]
SENSFLAG_ACC	SENSITIVITY CAN BE RAISED [NOT USED]
SENDWNFG_ACC	SENSITIVITY CANNOT BE LOWERED [NOT USED]
SCAN_ACC	FALSE IF ACCOMODATION DESIRED ON INITIAL SCAN [NOT USED]
SCAN_DIR	DIRECTION SENSITIVITY IS ALLOWED TO CHANGE
		-1 DOWN, 1 UP, 0 EITHER
CHANGE_ACC	TRUE IF SCENE HAS CHANGED
ACCOMINIT	TRUE IF EDGE FOLLOWER SHOULD INIT SCANNER
TABLE_ACC	HOLDS AD READINGS FOR DAC SETTINGS READ, -1 FOR OTHERS
;

SIMPLE INTERNAL PROCEDURE ACCOON;
	BEGIN INTEGER I;
	IF DISDEV≠2 THEN OUTSTR("NO DEBUGGING ON THIS DEVICE"&CRLF) ELSE
	IF (FRAMEX←GETPOG)≥0 THEN DISSHW←ADEB←TRUE ELSE
		OUTSTR("NO FREE FRAMES - ACCOON"&CRLF);
	END;

SIMPLE INTERNAL PROCEDURE ACCOFF;
	BEGIN
	ADEB ← FALSE;
	RELPOG(FRAMEX);
	END;
⊃	DEBUGGING ROUTINES;

SIMPLE PROCEDURE SHOW(STRING FOO; INTEGER X1,Y1,X2,Y2);
	BEGIN INTEGER I, CNT, DISSAVE;
	DISSAVE ← DPYPARS;
	DPYSET(DISPL);
	DPYBRT(3);
	DPYBIG(3);
	SETFORMAT(3,0);
	AIVECT(-512,400);
	DPYSST(FOO&CRLF&"TCLIP="&CVS(TCLIP)&CRLF&"BCLIP="&CVS(BCLIP)&CRLF&
		"DAC="&CVS(DAC_ACC)&CRLF&"INT1="&CVS(I1)&CRLF&"INT2="&
		CVS(I2)&CRLF&"IWID="&CVS(IWID));
	DPYSST(CRLF&"AUTO_ACC ="&CVS(AUTO_ACC)&CRLF);
	DPYSST("CHANGE= "&(IF CHANGE_ACC THEN "TRUE" ELSE "FALSE"));
	DPYSST(CRLF&"SENS IS "&(IF ¬SENSFLAG_ACC THEN "UP" ELSE
		IF SENDWNFG_ACC THEN "DOWN" ELSE ""));
	APT(TVX(X1),TVY(Y1));
	APT(TVX(X2),TVY(Y2));
	DPYOUT(FRAMEX);
	DPYRESET(DISSAVE);
	IF CNT≤0 THEN
		BEGIN
		IF "0"≤(I←INCHRW)≤"9" THEN CNT←CNT+I-"0"
		END ELSE CNT←CNT-1;
	IF I="Y" THEN DISSHW ← TRUE;
	IF I="N" THEN DISSHW ← FALSE;
	END;
⊃	INITIALIZES SENSITIVITY CONTROL;

SIMPLE PROCEDURE SENSINIT;
	BEGIN LABEL HALF, LOUT, L2;
	INTEGER UDAC, LDAC, I, J, K, TST, PT, CURAD;
	IF ¬AUTOCAL_ACC THEN
L2:		BEGIN "INIT"
		FOR I←2 STEP 1 UNTIL 61 DO TABLE_ACC[I] ← -1;
		AUTO_ACC ← 60;
		TABLE_ACC[LDAC←62] ← DACO(LDAC);
		TABLE_ACC[UDAC←1] ← DACO(UDAC);
		IF ABS(TABLE_ACC[62]-TABLE_ACC[1])<100 THEN
			BEGIN
			OUTSTR("SENSITIVITY CONTROL IS HUNG"&CRLF&
				"TYPE R TO RETRY, ANYTHING ELSE"
				&" TO DISABLE"&CRLF);
			I ← INCHWL;
			IF I="R" THEN GO TO L2;
			NODAC ← TRUE;
			RETURN;
			END;
		AUTOCAL_ACC ← TRUE;
		GO TO HALF;
		END "INIT";
	TABLE_ACC[1] ← CURAD ← DACO(1);
	IF ABS(CURAD-(J←TABLE_ACC[AUTO_ACC]))<40 THEN GO TO LOUT;
	IF CURAD<J THEN
		BEGIN "HI"
		UDAC ← 1;
		LDAC ← AUTO_ACC;
		AUTO_ACC ← AUTO_ACC-1;
		GO TO HALF;
		END "HI";
	TST ← 10000;
	FOR I←62 STEP -1 UNTIL AUTO_ACC DO
		IF (J←TABLE_ACC[I])≥0∧(K←ABS(CURAD-J))<TST THEN
		BEGIN 
		IF K<20 THEN BEGIN AUTO_ACC ← I; GO TO LOUT; END;
		TST ← K; PT ← I;
		END;
	J ← IF K←(TABLE_ACC[PT]>CURAD) THEN -1 ELSE 0;
	TST ← PT;
	WHILE TABLE_ACC[TST←TST+J]<0 DO;
	IF K THEN BEGIN LDAC←PT; UDAC←TST; END ELSE
		BEGIN LDAC←TST; UDAC←PT; END;
	IF LDAC-UDAC<2 THEN
LOUT:		BEGIN "OUT"
		SENSCAL_ACC ← TRUE;
		CHANGE_ACC ← FALSE;
		IF AUTO_ACC≠DAC_ACC THEN DACO(AUTO_ACC);
		IF TYP_EDGE THEN OUTSTR("AUTO TARGET SET AT  "&
			CVS(AUTO_ACC)&CRLF);
		RETURN;
		END "OUT";
HALF:	I ← (LDAC+UDAC) DIV 2;
	CURAD ← TABLE_ACC[I] ← DACO(I);
	IF ABS(CURAD-TABLE_ACC[UDAC])<50 THEN
		BEGIN "L1"
		UDAC ← I;
		IF LDAC-UDAC<2 THEN
			BEGIN
			IF CURAD-TABLE_ACC[I-1]>50 THEN DACO(AUTO_ACC←I-1)
				ELSE AUTO_ACC←I;
			GO TO LOUT;
			END;
		GO TO HALF;
		END "L1";
	LDAC ← I;
	AUTO_ACC ← LDAC-1;
	IF LDAC-UDAC<2 THEN GO TO LOUT;
	GO TO HALF;
	END;
⊃	SET CLIP LEVELS TO JUST INCLUDE THE RANGE
		OF INTENSITIES GIVEN;

SIMPLE BOOLEAN PROCEDURE CLIPSET(REFERENCE INTEGER INT, INT2);
	BEGIN INTEGER BIG, T, B;
	T←TCLIP+(BCLIP-TCLIP)*(15-(INT MAX INT2))%14;
	B←BCLIP-(BCLIP-TCLIP)*(INT MIN INT2)%14;
	IF T>B THEN
		BEGIN
		OUTSTR("CLIP LEVELS REVERSED - CLIPRANGE"&CRLF);
		TCLIP↔BCLIP;
		END;
	IF TCLIP=T∧BCLIP=B THEN RETURN(TRUE);
	TCLIP←T;BCLIP←B;TVRESET;
	RETURN(FALSE);
	END;

⊃	TEST FOR RASTER SCAN FOR ACOMTEST.
	X2, Y2 MUST BE SET BEFORE CALLING;

SIMPLE BOOLEAN PROCEDURE TEST1(REFERENCE INTEGER X,Y);
	BEGIN INTEGER I, J;
	I1 ← GENTER(X, Y, J←-1,I);
	I2 ← GENTER(X2, Y2, J←-1,I);
	RETURN(ABS(I1-I2)≥GTHRES∨((I1 MIN I2)>0∧(I1 MAX I2)<15));
	END;

⊃	TEST FOR EDGE TRACING. TRAC, CW MUST BE SET BEFORE CALLING;

SIMPLE BOOLEAN PROCEDURE TEST2(REFERENCE INTEGER X,Y);
	BEGIN
	INTEGER I,COH;
	COH ← YOPER(X, Y, DIR, CW, TRAC, I←0);
	I1 ← OD+.5;
	I2 ← OB+.5;
	RETURN(COH≥2);
	END;

⊃	TEST FOR RASTER SCAN FOR FINEAC.  X2, Y2 MUST BE SET BEFORE CALLING;

SIMPLE BOOLEAN PROCEDURE TEST3(REFERENCE INTEGER X,Y);
	BEGIN INTEGER I, J;
	I1 ← GENTER(X, Y, J←-1, I);
	I2 ← GENTER(X2, Y2, J←-1, I);
	RETURN(ABS(I1-I2)≥GTHRES);
	END;
⊃	GENERAL ACCOMODATION ROUTINE;

BOOLEAN PROCEDURE ACC(BOOLEAN CC;INTEGER MDAC, X, Y;BOOLEAN PROCEDURE TST);
	BEGIN INTEGER I, J, MX, MN, AD, K, BS, TS;
	LABEL L1, A, B, C;

⊃	QUICK TEST FOR AUTOTARGET LIMIT;

	IF TVCAM=1 THEN
		BEGIN
		IF (¬I1∨¬I2)∧BCLIP=7∧AUTO_ACC=DAC_ACC∧¬CHANGE_ACC∧
			(BCLIP-TCLIP)≤CLIPDIF THEN RETURN(FALSE);
		END ELSE IF (¬I1∨¬I2)∧BCLIP=7∨(I1=15∨I2=15)∧¬TCLIP
			THEN RETURN(FALSE);

	⊃	INIT LEGAL DAC TABLE;

	IF ¬NODAC THEN
		BEGIN
		TDAC[63] ← FALSE;
		TDAC[AUTO_ACC-1] ← FALSE;
		TDAC[AUTO_ACC] ← TRUE;
		ARRBLT(TDAC[AUTO_ACC+1],TDAC[AUTO_ACC],62-AUTO_ACC);
		END;
	IF CLIPDIF<7 THEN
		BEGIN
		BS ← BCLIP;
		TS ← TCLIP;
		IF BCLIP<7∨TCLIP THEN
			BEGIN BCLIP ← 7; TCLIP ← 0; TVRESET; END;
		END;

	⊃	ADJUST DAC AS NECESSARY AND POSSIBLE;

L1:	IF TST(X,Y) THEN GO TO B;
	MN ← I1 MIN I2;
	MX ← I1 MAX I2;
	IF MX>15 THEN
		BEGIN
		OUTSTR("INT TOO LARGE"&CRLF);
		MX←15;
		IF I1>15 THEN I1←15 ELSE I2←15;
		END;
	IF MN<0 THEN
		BEGIN
		OUTSTR("INT TOO SMALL"&CRLF);
		MX←0;
		IF I1<0 THEN I1←0 ELSE I2←0;
		END;
	IF (¬MN∧MX=15)∨(MN>0∧MX<15)∨(MX-MN)>GTHRES∨TVCAM≠1∨NODAC
		THEN GO TO A;
	IF MN THEN
		BEGIN "MN"
		FOR I←1 STEP 1 UNTIL MDAC+1 DO
			IF ¬TDAC[DAC_ACC+I] THEN DONE;
		I ← I-1;
		IF ¬I THEN GO TO A;
		J ← DAC_ACC;
		TABLE_ACC[DAC_ACC+I] ← DACO(DAC_ACC+I);
		IF ADEB THEN SHOW("DOWN",X,Y,X2,Y2);
		GO TO L1;
		END "MN";
	AD ← 0;
	FOR I←1 STEP 1 UNTIL MDAC+1 DO IF ¬TDAC[DAC_ACC-I] THEN DONE;
	I ← I-1;
	IF ¬I THEN
		BEGIN
		IF (DAC_ACC-1>AUTO_ACC)∨¬CHANGE_ACC THEN GO TO A;
		I ← MDAC ← 1;
		TABLE_ACC[DAC_ACC] ← AD ← DDACO(-1);
		END;
	J ← DAC_ACC;
	I ← TABLE_ACC[DAC_ACC-I] ← DACO(DAC_ACC-I);
	IF ADEB THEN SHOW("UP",X,Y,X2,Y2);
	IF AD THEN
		BEGIN "AD"
		IF ABS(AD-I)<10 THEN
			BEGIN
			DAC_ACC ← J;
			CHANGE_ACC ← FALSE;
			GO TO A;
			END;
		TDAC[AUTO_ACC←DAC_ACC] ← TRUE;
		TDAC[AUTO_ACC-1] ← FALSE;
		END "AD";
	GO TO L1;

	⊃	ADJUST CLIPS FOR PROPER OUTPUT;

A:	IF CLIPDIF=7 THEN GO TO C;
	IF I1>15 THEN BEGIN OUTSTR("I1 TOO LARGE"&CRLF);I1←15;END;
	IF I2>15 THEN BEGIN OUTSTR("I2 TOO LARGE"&CRLF);I2←15;END;
	IF I1<0 THEN BEGIN OUTSTR("I1 TOO SMALL"&CRLF);I1←0;END;
	IF I2<0 THEN BEGIN OUTSTR("I2 TOO SMALL"&CRLF);I2←0;END;
	IF CLIPSET(I1, I2) THEN GO TO C;
	IF TST(X,Y) THEN
B:		AD ← TRUE ELSE
			BEGIN
			IF TCLIP≠BCLIP THEN GO TO A;
C:			AD ← FALSE;
			END;
	IF BS≠BCLIP∨TS≠TCLIP THEN OUTCLIP("ACC") ELSE
		IF TYP_EDGE THEN OUTSTR("CLIPS RETAINED"&CRLF);
	RETURN(AD);
	END;
⊃	ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS;

SIMPLE INTERNAL BOOLEAN PROCEDURE ACOMTEST(REFERENCE INTEGER INT, INT2;
		INTEGER X,Y,LX,LY);
	BEGIN INTEGER A, B, C, TST;
	A ← TCLIP;
	B ← BCLIP;
	C ← DAC_ACC;
	X2 ← LX;
	Y2 ← LY;
	I1 ← INT;
	I2 ← INT2;
	ACC(TRUE,3,X,Y,TEST1);
	INT ← I1;
	INT2 ← I2;
	IF BCLIP-TCLIP<CLIPDIF THEN
		BEGIN
		TCLIP ← (TCLIP+BCLIP+CLIPDIF) DIV 2;
		BCLIP ← TCLIP+CLIPDIF;
		IF BCLIP>7 THEN BEGIN BCLIP←7;TCLIP←7-CLIPDIF;END;
		IF TCLIP<0 THEN BEGIN TCLIP←0;BCLIP←CLIPDIF;END;
		END;
	IF (TST ← A≠TCLIP∨B≠BCLIP∨C≠DAC_ACC) THEN OUTCLIP("ACOMTEST");
	RETURN(TST);
	END;

⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST DURING A RASTER SCAN;

SIMPLE INTERNAL BOOLEAN PROCEDURE FINEAC(INTEGER X1,Y1,X,Y,INT,INT2);
	BEGIN
	X2 ← X;
	Y2 ← Y;
	I1 ← INT;
	I2 ← INT2;
	RETURN(ACC(FALSE,3,X1,Y1,TEST3));
	END;

⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST WHILE TRACING;

SIMPLE INTERNAL BOOLEAN PROCEDURE ACCOMO(INTEGER X,Y;
		REFERENCE INTEGER ANGLE,CWX);
	BEGIN BOOLEAN T;
	TRAC ← TRUE;
	X2 ← X;
	Y2 ← Y;
	CW ← CWX;
	I1 ← OB+.5;
	I2 ← OD+.5;
	T ← ACC(FALSE,5,X,Y,TEST2);
	ANGLE ← DIR;
	RETURN(T);
	END;
⊃  VERIFIES  THAT  DETECTED  DISCONTINUITY  BELONGS TO AN OBJECT EDGE OF
   SUFFICIENT EXTENT THAT ATLEAST 14 POINTS IN A 4*4 RECT.  WHOSE  UPPER
   OR  LOWER  LEFT HAND CORNER IS THE FIRST POINT THAT DIFFERED FROM THE
   BACKGROUND ALSO DIFFER FROM THE BACKGROUND BY AT LEAST AS MUCH. XINCR
   IS  SIGNED  INCREMENT  IN  X DIRECTION, SIGFLAG IS TRUE IF OBJECT(2ND
   SAMPLE IN DIRECTION OF SCAN) IS BRIGHTER THAN BACKGROUND;
	
DEFINE	RSET(X)="BEGIN IF TST THEN
			BEGIN
			FLINE←XT;
			LLINE←XB;
			LSIDE←XL;
			RSIDE←XR;
			TVIN;
			END;
		RETURN(X);
		END";

SIMPLE INTERNAL BOOLEAN PROCEDURE XTENT(INTEGER X,Y,XINCR; BOOLEAN SIGFLAG);
	BEGIN "XTNT"
	INTEGER K,L,COUNT1,COUNT2, STEPX,T,B,LL,R,XT,XB,XL,XR,TST,
		SIDER,SIDEL,LINEF,LINEL,ND,INC;
	XT←FLINE; XB←LLINE; XL←LSIDE; XR←RSIDE;
	TST←FALSE;
	STEPX ← IF SIGFLAG THEN 1 ELSE -1;
	B←LINEL←(BMAX-1) MIN (Y+4);
	T←LINEF←(Y-4) MAX (TMAX+1);
	IF XINCR>0 THEN 
		BEGIN
		INC←1;
		LL←SIDEL←(LSMAX+1) MAX (X-XINCR-3);
		R←SIDER←(RSMAX-1) MIN (X+3);
		END ELSE BEGIN
		INC←-1;
		R←SIDEL←(RSMAX-1)MIN (X-XINCR+3);
		LL←SIDER←(LSMAX+1) MAX (X-3);
		END;
	COUNT1←COUNT2←INT2←INT←0;
	IF B>LLINE∨T<FLINE∨LL<LSIDE∨R>RSIDE THEN
		BEGIN
		LLINE←B;
		FLINE←T;
		LSIDE←LL;
		RSIDE←R;
		TVIN;
		TST←TRUE;
		INTPNT;
		END;
	LINEL←LINEL-FLINE;
	LINEF←LINEF-FLINE;
	SIDEL←SIDEL-LSIDE;
	SIDER←SIDER-LSIDE;
	ND←SIDEL+INC*3;
	FOR K←SIDEL STEP INC UNTIL ND  DO
		BEGIN
		FOR L←LINEF STEP 1 UNTIL LINEF+3  DO
			BEGIN
			INT←INT+GETPNT(K,L);
			COUNT1 ← COUNT1+1;
			END;
		FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
			BEGIN
			INT2←INT2+GETPNT(K,L);
			COUNT2 ← COUNT2+1;
			END;
		END;
	INT ← INT/COUNT1+.5;
	INT2←INT2/COUNT2+.5;
	INT ← IF SIGFLAG THEN INT MIN INT2 ELSE INT MAX INT2;
	ND←SIDER-INC*3;
	COUNT2 ← COUNT1←0;
	FOR K←ND STEP INC UNTIL SIDER DO
	   FOR L←LINEF STEP 1 UNTIL LINEF+3 DO
		BEGIN "XT2" 
		INT2←GETPNT(K,L);
		IF ABS(INT2-INT)≥GTHRES THEN COUNT1 ← COUNT1+1;
		COUNT2 ← COUNT2+1;
		END "XT2";
	IF COUNT2-COUNT1<GTHRES THEN RSET(TRUE);
	COUNT1 ← COUNT2←0;
	FOR K←ND STEP INC UNTIL SIDER DO
		FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
		BEGIN "XT5" 
		INT2←GETPNT(K,L) ;
		IF ABS(INT2-INT)≥GTHRES THEN COUNT2 ← COUNT2+1;
		COUNT1 ← COUNT1+1;
		END "XT5";
	RSET(COUNT1-COUNT2<3);
	END "XTNT";
⊃ 	TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
		IN THE RIGHT WAY FROM I1 TO AN EXTENT SUFFICIENT
		TO CONSTITUTE A POSSIBLE EDGE;

SIMPLE INTERNAL BOOLEAN PROCEDURE DISCON(INTEGER II1,II2,X1,Y1,X2,Y2);
	BEGIN "DISCO"
	I1←II1;
	I2←II2;
	IF ADEB∧DISSHW THEN SHOW("DISCON",X1,Y1,X2,Y2);
	RETURN(ABS(I2-I1)≥GTHRES);
	END "DISCO";

⊃	CALLED AT START OF RUN;

SIMPLE INTERNAL INTEGER PROCEDURE SCANINIT;
	BEGIN "INIT"
	IF TVCAM=1 THEN
		BEGIN "ACCOM"
		IF DAC_ACC<0 THEN DACO(-DAC_ACC);
		SCAN_DIR ← 0;
		IF (¬SENSCAL_ACC∨CHANGE_ACC) THEN SENSINIT;
		END "ACCOM" ELSE BEGIN
		CHANGE_ACC←FALSE;
		SENSCAL_ACC←TRUE;
		DAC_ACC←AUTO_ACC←30;
		END;
	TCLIP ← BCLIP ← 5;
	CLIPCHG(CLDIFF);
	END "INIT";
END "SCNER";